/**
 * @content 抽象基类，用于定义所有的几何注记对象基类功能组件
 * @author  2019-09-09
 */
import { NativeModules } from 'react-native';
import Rect from './Rect.js';
import Geometry from './Geometry.js';
import Dot from './Dot.js';

let GA = NativeModules.JSGeoAnno;

/**
 * @class GeoAnno
 */
export default class GeoAnno extends Geometry {
  constructor() {
    super();
    Object.defineProperty(this, '_MGGeoAnnoId', {
      get: function() {
        return this._MGGeometryId;
      },
      set: function(_MGGeoAnnoId) {
        this._MGGeometryId = _MGGeoAnnoId;
      },
    });
  }
  /**
   * 拷贝几何信息
   * @memberOf GeoAnno
   * @param geometry 被拷贝的几何对象
   * @returns {Promise} 成功克隆返回1，失败返回0
   */
  async clone(geometry) {
    try {
      return await GA.clone(this._MGGeoAnnoId, geometry._MGGeometryId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 清空几何数据
   * @memberOf GeoAnno
   * @returns {Promise} 清空数据成功返回1，失败返回0
   */
  async empty() {
    try {
      return await GA.empty(this._MGGeoAnnoId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 计算几何注记的外包围盒
   * @memberOf GeoAnno
   * @returns {Promise.<Rect>} 包围盒信息
   */
  async calRect() {
    try {
      let { RectId } = await GA.calRect(this._MGGeoAnnoId);
      var rect = new Rect();
      rect._MGRectId = RectId;
      return rect;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 是否在矩形内
   * @memberOf GeoAnno
   * @param rect 待比较的包围盒对象
   * @returns {Promise}在包围盒内返回1，不在返回0
   */
  async isInRect(rect) {
    try {
      return await GA.isInRect(this._MGGeoAnnoId, rect._MGRectId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 是否和矩形相交
   * @memberOf GeoAnno
   * @param rect 待比较的包围盒对象
   * @returns {Promise} 和包围盒相交返回1，不相交返回0
   */
  async isInterRect(rect) {
    try {
      return await GA.isInterRect(this._MGGeoAnnoId, rect._MGRectId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 取注记维数
   * @memberOf GeoAnno
   * @returns {Promise} 注记维数
   */
  async getDimension() {
    try {
      return await GA.getDimension(this._MGGeoAnnoId);
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 投影变换
   * @memberOf GeoAnno
   * @param ptOrigSRef 原始投影系
   * @param ptDestSRef 目标投影系
   * @returns {Promise<Geometry>} 投影后的几何对象
   */
  async transSRS(origSRef, destSRef) {
    try {
      let { GeometryId } = await GA.transSRS(
        this._MGGeoAnnoId,
        origSRef._MGSRefDataId,
        destSRef._MGSRefDataId
      );
      var geometry = new Geometry();
      geometry._MGGeometryId = GeometryId;
      return geometry;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 投影变换
   * @memberOf GeoAnno
   * @param ptOrigSRef 原始投影系
   * @param ptDestSRef 目标投影系
   * @param param 椭球坐标系变换参数
   * @returns {Promise<Geometry>}投影后的几何对象
   */
  async transSRSOfParam(origSRef, destSRef, param) {
    try {
      let { GeometryId } = await GA.transSRS(
        this._MGGeoAnnoId,
        origSRef._MGSRefDataId,
        destSRef._MGSRefDataId,
        param._MGElpTransParamId
      );
      var geometry = new Geometry();
      geometry._MGGeometryId = GeometryId;
      return geometry;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 获取定位点
   * @memberOf GeoAnno
   * @returns {Promise<Dot>} 定位点
   */
  async getAnchorDot() {
    try {
      let { point2DId } = await GA.getAnchorDot(this._MGGeoAnnoId);
      var point2DDot = new Dot();
      point2DDot._MGGeometryId = point2DId;
      return point2DDot;
    } catch (e) {
      console.error(e);
    }
  }

  /**
   * 设置定位点
   * @memberOf GeoAnno
   * @param  dot 定位点坐标
   * @returns {Promise<void>}
   */
  async setAnchorDot(dot) {
    try {
      await GA.setAnchorDot(this._MGGeoAnnoId, dot._MGDotId);
    } catch (e) {
      console.error(e);
    }
  }
}
